Nginx 使用 acme.sh 生成和自动续签证书
安装 acme.sh
Github:https://github.com/acmesh-official/acme.sh
中文文档:https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E
# 邮箱用于提醒证书过期
curl https://get.acme.sh | sh -s email=mwjwork@qq.com
通过安装日志,可以知道安装位置,这里安装到了 /root/.acme.sh/ 目录下。
修改默认 CA
acme.sh脚本默认ca服务器是zerossl,经常出错,会导致获取证书的时候一直出现:Pending, The CA is processing your order, please just wait.
只需要把ca服务器改成letsencrypt 即可,虽然更改以后还是有概率出现pending,但基本2-3次即可成功
cd /root/.acme.sh/
./acme.sh --set-default-ca --server letsencrypt
DNS 验证
注:手动验证不支持证书到期后自动更新证书,这里采用自动验证(DNS API)。
以阿里的为例。https://github.com/acmesh-official/acme.sh/wiki/dnsapi#dns_ali
阿里 RAM 用户及需要的权限
创建 RAM 用户:https://ram.console.aliyun.com/users
创建时勾选复选框:使用永久 AccessKey 访问创建 AccessKey ID 和 AccessKey Secret,支持通过 API 或其他开发工具访问
然后把 key 和 secret 复制保存下来。
然后进入该 RAM 用户的权限管理,并授予以下四个权限:
AliyunDNSFullAccess
AliyunHTTPDNSFullAccess
AliyunPubDNSFullAccess
AliyunDomainFullAccess
导入 key 和 secret
export Ali_Key="key123456789"
export Ali_Secret="secret123456789"
签发证书
./acme.sh --issue --dns dns_ali -d aday.fun -d *.aday.fun
执行后,Ali_Key 和 Ali_Secret 将保存在 ~/.acme.sh/account.conf 中,并在需要时自动获取,无需手动再设置。
复制证书
证书生成好以后,我们需要把证书复制给对应的 Apache、Nginx 或其他服务器去使用。
必须使用 --install-cert 命令来把证书复制到目标文件,请勿直接使用 ~/.acme.sh/ 目录下的证书文件,这里面的文件都是内部使用,而且目录结构将来可能会变化。
Nginx 示例:
mkdir -p /etc/nginx/ssl
./acme.sh --install-cert -d aday.fun -d *.aday.fun \
--key-file /etc/nginx/ssl/aday.fun.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "service nginx reload"
Nginx 的配置项 ssl_certificate 需要使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/"domain".cer ,否则 SSL Labs 的测试会报证书链问题(Chain issues Incomplete)。
默认情况下,证书每 60 天更新一次(可自定义)。更新证书后,Apache 或者 Nginx 服务会通过 reloadcmd 传递的命令自动重载配置。
注意:reloadcmd 非常重要。证书会自动申请续签,但是如果没有正确的 reloadcmd 命令,证书可能无法被重新应用到 Apache 或者 Nginx,因为配置没有被重载。
Nginx 配置参考:Nginx 开启 https 访问
查看已安装证书
./acme.sh --info -d *.aday.fun
更新证书
目前证书每 60 天自动更新,你无需任何操作。
crontab -l
56 * * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
但是你也可以强制续签证书:
./acme.sh --renew -d aday.fun -d *.aday.fun --force
使用 openssl 转换 fullchain.cer 为 fullchain.crt 证书
如果不需要 .crt 证书,则跳过该章节(nginx 可以不需要,只使用 fullchain.cer 和 aday.fun.key 即可。)。
但有些时候我们需要其他格式的证书,比如: FRP 内网穿透工具启用 https 时,需要 .crt 证书。
FRP 文档参考:FRP:为本地 HTTP 服务启用 HTTPS
cd /root/.acme.sh/aday.fun_ecc
# cer 转 crt
$ openssl x509 -inform PEM -in fullchain.cer -out fullchain.crt
更多转换参考:Linux 使用 openssl 转换证书格式